package leetcode.栈队列堆;

import java.util.*;

/**
 * 347. 前K个高频元素
 *
 * TOPK 问题一般用最大堆最小堆解决
 */
public class Test347前K个高频元素 {

    // 此题用最小堆实现
    public List<Integer> topKFrequent(int[] nums, int k) {
        HashMap<Integer, Integer> map = new HashMap<>();

        for (int num : nums) {
            map.put(num, map.getOrDefault(num, 1) + 1);
        }

        PriorityQueue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
            public int compare(Integer a, Integer b) {
                return map.get(a) - map.get(b);
            }
        });

        for (int key : map.keySet()) {
            // 确保堆最大只能是 k 个长度
            if (queue.size() < k) {
                queue.add(key);
            } else if (map.get(key) > map.get(queue.peek())) {
                queue.remove();
                queue.add(key);
            }
        }
        List<Integer> res = new ArrayList<>();
        while (!queue.isEmpty()) {
            res.add(queue.remove());
        }
        return res;
    }
}
